#[cfg(test)]
use kaolinite::{document::*, event::*, utils::*};

#[test]
fn double_counting() {
    // Test data
    let test1_map = vec![];
    let test2_map = vec![(1, 1), (5, 4)];
    let test3_map = vec![(1, 1), (3, 2), (6, 4), (8, 5)];
    // Output
    let results = vec![
        dbl_count(&test1_map, true, 0),
        dbl_count(&test1_map, false, 3),
        dbl_count(&test2_map, true, 3),
        dbl_count(&test2_map, false, 6),
        dbl_count(&test3_map, true, 6),
        dbl_count(&test3_map, false, 6),
    ];
    // Verification
    assert_eq!(results, vec![0, 0, 1, 2, 2, 4]);
}

#[test]
fn line_trimming() {
    // Test data
    let test1 = "".to_string();
    let test2 = "hello world".to_string();
    let test3 = "hello wor蔼t教案ld".to_string();
    let test4 = "蔼教案蔼教案教蔼".to_string();
    // Output
    let results = vec![
        trim(&test1, 0, 0),
        trim(&test1, 128, 128),
        trim(&test2, 6, 5),
        trim(&test2, 6, 7),
        trim(&test3, 0, 13),
        trim(&test3, 13, 4),
        trim(&test4, 1, 2),
        trim(&test4, 1, 4),
    ];
    // Verification
    assert_eq!(results, vec![
        "".to_string(),
        "".to_string(),
        "world".to_string(),
        "world".to_string(),
        "hello wor蔼t ".to_string(),
        " 案l".to_string(),
        "  ".to_string(),
        " 教 ".to_string(),
    ]);
}

#[test]
fn hashmap_utilities() {
    // Test data
    let mut test1 = sugars::hmap!{ 
        0 => vec![(3, 3)],
        1 => vec![(1, 1), (3, 2)],
    };
    let test1_1 = sugars::hmap!{
        0 => vec![(3, 3), (6, 5)],
        1 => vec![(1, 1), (3, 2)],
    };
    let test1_2 = sugars::hmap!{
        0 => vec![(3, 3), (6, 5)],
        1 => vec![(1, 1), (3, 2)],
        2 => vec![(7, 7)],
    };
    // Output & Verification
    hm_add(&mut test1, 0, (6, 5));
    assert_eq!(test1, test1_1);
    hm_add(&mut test1, 2, (7, 7));
    assert_eq!(test1, test1_2);
}

#[test]
fn filetype_detection() {
    // Test data
    let test1 = "rs";
    let test2 = "txt";
    let test3 = "jsb";
    let test4 = "frag";
    // Output
    let results = vec![
        filetype(test1).unwrap_or("Unknown".to_string()),
        filetype(test2).unwrap_or("Unknown".to_string()),
        filetype(test3).unwrap_or("Unknown".to_string()),
        filetype(test4).unwrap_or("Unknown".to_string()),
    ];
    // Verification
    assert_eq!(
        results, 
        vec![
            "Rust".to_string(),
            "Plain Text".to_string(), 
            "Unknown".to_string(),
            "GLSL".to_string(),
        ]
    );
}

#[test]
fn errors() {
    // Test data
    let test1 = Error::OutOfRange;
    // Output
    let result = format!("{:?}", test1);
    // Verification
    assert_eq!(result, "OutOfRange".to_string());
}

#[test]
fn document_positioning() {
    // Test data
    let doc = Document::open((10, 10), "../demos/2.txt");
    // Output
    
    // Verification
}

/*
Template:

#[test]
fn name() {
    // Test data
    // Output
    // Verification
}

*/
